package frpc.manager.basics;

import fdupc.countext.SpringContextUtil;
import frpc.manager.lock.IRedisLockManager;
import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * 类描述:  Redis基础处理对象
 *
 * @author 王雷
 * @version 1.0.0
 * @date 2020/11/26 0026 下午 3:59
 */
@SuppressWarnings("unchecked")
public class RedisBasicsBusinessManager implements IRedisBusinessManager {

    /**
     * 属性描述：Redisson锁对象
     *
     * @date : 2020/11/30 0030 下午 6:56
     */
    protected final IRedisLockManager iRedisLockManager;

    /**
     * 功能描述：Redis基础处理对象
     *
     * @param iRedisLockManager Redis——锁处理接口
     * @author : 王雷
     * @date : 2020/11/26 0026 下午 4:48
     */
    protected RedisBasicsBusinessManager(IRedisLockManager iRedisLockManager) {
        this.iRedisLockManager = iRedisLockManager;
    }

    /**
     * 功能描述：获取Redis操作对象
     *
     * @return Redis操作对象
     * @date : 2021/4/16 0016 下午 4:15
     */
    protected <T> RedisTemplate<String, T> giveRedisTemplate() {
        return SpringContextUtil.giveBean("redisTemplate", RedisTemplate.class);
    }

    /**
     * 功能描述：指定缓存失效时间
     *
     * @param key  目标Key
     * @param time 时间——单位：秒
     * @throws RuntimeException 自定义线程级异常
     * @author : 王雷
     * @date : 2019/9/10 0010 下午 2:27
     */
    @Override
    public void expire(String key, long time) {
        expire(key, time, TimeUnit.SECONDS);
    }

    /**
     * 功能描述：指定缓存失效时间
     *
     * @param key  目标Key
     * @param time 时间——单位：秒
     * @throws RuntimeException 自定义线程级异常
     * @author : 王雷
     * @date : 2019/9/10 0010 下午 2:27
     */
    @Override
    public void expire(String key, long time, TimeUnit timeUnit) {
        if (time > 0) {
            giveRedisTemplate().expire(key, time, (timeUnit == null) ? TimeUnit.SECONDS : timeUnit);
        }
    }

    /**
     * 功能描述：获取对象的类型
     *
     * @param key 目标Key
     * @author : 王雷
     * @date : 2019/9/10 0010 下午 2:27
     */
    @Override
    public DataType giveTypeToKey(String key) {
        return giveRedisTemplate().type(key);
    }

    /**
     * 根据key 获取过期时间
     *
     * @param key 键 不能为null
     * @return 时间(秒) 返回0代表为永久有效
     * @throws RuntimeException 自定义线程级异常
     */
    @Override
    public Long getExpire(String key) {
        return giveRedisTemplate().getExpire(key, TimeUnit.SECONDS);
    }

    /**
     * 判断key是否存在
     *
     * @param key 键
     * @return true 存在 false不存在
     * @throws RuntimeException 自定义线程级异常
     */
    @Override
    public Boolean hasKey(String key) {
        return giveRedisTemplate().hasKey(key);
    }

    /**
     * 删除缓存
     *
     * @param key 可以传一个值 或多个
     */
    @Override
    public void del(String... key) {
        del(Arrays.asList(key));
    }

    /**
     * 删除缓存
     *
     * @param keys key集合
     */
    @Override
    public void del(List<String> keys) {
        if (keys != null && !keys.isEmpty()) {
            giveRedisTemplate().delete(keys);
        }
    }

    /**
     * 获取所有的Key
     *
     * @return 当前Redis中存放的所有Key；
     * @author 王雷    (2018年3月2日 下午3:49:45)
     */
    @Override
    public Set<String> readKeys(String keyTitle) {
        keyTitle = (keyTitle == null || "".equals(keyTitle)) ? "*" : (keyTitle + "*");
        return giveRedisTemplate().keys(keyTitle);
    }

    /**
     * 获取所有的Key
     *
     * @return 当前Redis中存放的所有Key；
     * @author 王雷    (2018年3月2日 下午3:49:45)
     */
    @Override
    public Set<String> readKeys() {
        return readKeys("");
    }
}
